/**
 * 串口通信类 - 提供树莓派串口操作
 * 
 * 该类封装了Linux下的串口通信，提供简洁的API接口
 * 支持常见的串口参数配置，适用于树莓派与外部设备通信
 */
#ifndef SERIAL_HPP
#define SERIAL_HPP

#include <string>
#include <vector>
#include <termios.h>
/// @brief //////////AAAAAAA
class SerialPort {
public:
    /**
     * 构造函数
     */
    SerialPort();
    
    /**
     * 析构函数
     * 确保在对象销毁时关闭串口
     */
    ~SerialPort();

    // -------- 串口控制方法 --------
    /**
     * 打开串口设备
     * @param portName 串口设备路径，如"/dev/ttyUSB0"
     * @param baudRate 波特率，默认115200
     * @param dataBits 数据位，默认8位
     * @param stopBits 停止位，默认1位
     * @param parity 校验位，'N'无校验，'E'偶校验，'O'奇校验
     * @return 成功返回true，失败返回false
     */
    bool open(const std::string& portName, int baudRate = 115200, int dataBits = 8, int stopBits = 1, char parity = 'N');
    
    /**
     * 关闭串口设备
     */
    void close();
    
    /**
     * 检查串口是否已打开
     * @return 已打开返回true，否则返回false
     */
    bool isOpened() const;

    // -------- 数据通信方法 --------
    /**
     * 发送数据
     * @param data 要发送的数据
     * @return 实际发送的字节数，失败返回-1
     */
    int write(const std::vector<uint8_t>& data);
    
    /**
     * 发送字符串
     * @param data 要发送的字符串
     * @return 实际发送的字节数，失败返回-1
     */
    int write(const std::string& data);
    
    /**
     * 接收数据
     * @param buffer 用于存储接收数据的缓冲区
     * @param size 期望接收的最大字节数
     * @return 实际接收的字节数，失败返回-1
     */
    int read(std::vector<uint8_t>& buffer, size_t size);
    
    /**
     * 接收字符串
     * @param size 期望接收的最大字节数
     * @return 接收到的字符串
     */
    std::string readString(size_t size);
    
    /**
     * 读取一行数据（以换行符结尾）
     * @return 读取到的行（不包含换行符）
     */
    std::string readLine();
    
    /**
     * 设置读取超时
     * @param timeoutMs 超时时间（毫秒）
     */
    void setReadTimeout(int timeoutMs);
    
    /**
     * 获取树莓派上的可用串口列表
     * @return 串口设备路径列表
     */
    static std::vector<std::string> getAvailablePorts();
    
    /**
     * 获取最后的错误信息
     * @return 错误信息字符串
     */
    std::string getLastError() const;

private:
    // -------- 串口设备 --------
    int fd_;                  // 串口文件描述符
    termios old_tio_;         // 保存原始串口配置
    
    // -------- 状态信息 --------
    std::string port_name_;   // 串口设备路径
    int baud_rate_;           // 波特率
    bool is_open_;            // 串口是否已打开
    std::string last_error_;  // 最后的错误信息
};

#endif // SERIAL_HPP